package com.loeng.module.infra.service.logger;

import cn.hutool.core.util.StrUtil;
import com.loeng.framework.common.pojo.PageResult;
import com.loeng.framework.common.util.object.BeanUtils;
import com.loeng.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO;
import com.loeng.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO;
import com.loeng.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogSaveReqVO;
import com.loeng.module.infra.dal.dataobject.logger.ApiAccessLogDO;
import com.loeng.module.infra.dal.mysql.logger.ApiAccessLogMapper;
import com.loeng.module.system.enums.ErrorCodeConstants;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

import static com.loeng.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.loeng.module.infra.dal.dataobject.logger.ApiAccessLogDO.REQUEST_PARAMS_MAX_LENGTH;
import static com.loeng.module.infra.dal.dataobject.logger.ApiAccessLogDO.RESULT_MSG_MAX_LENGTH;

/**
 * API 访问日志 Service 实现类
 *
 * @author loeng zhuo
 */
@Service
public class ApiAccessLogServiceImpl implements ApiAccessLogService{

    @Resource
    private ApiAccessLogMapper apiAccessLogMapper;

    @Override
    public Long createApiAccessLog(ApiAccessLogSaveReqVO createReqVO) {
        // 插入
        ApiAccessLogDO apiAccessLog = BeanUtils.toBean(createReqVO, ApiAccessLogDO.class);
        apiAccessLogMapper.insert(apiAccessLog);
        // 返回
        return apiAccessLog.getId();
    }

    @Override
    public void updateApiAccessLog(ApiAccessLogSaveReqVO updateReqVO) {
        // 校验存在
        validateApiAccessLogExists(updateReqVO.getId());
        // 更新
        ApiAccessLogDO updateObj = BeanUtils.toBean(updateReqVO, ApiAccessLogDO.class);
        apiAccessLogMapper.updateById(updateObj);
    }

    @Override
    public void deleteApiAccessLog(Long id) {
        // 校验存在
        validateApiAccessLogExists(id);
        // 删除
        apiAccessLogMapper.deleteById(id);
    }

    private void validateApiAccessLogExists(Long id) {
        if (apiAccessLogMapper.selectById(id) == null) {
            throw exception(ErrorCodeConstants.API_ACCESS_LOG_NOT_EXISTS);
        }
    }

    @Override
    public ApiAccessLogDO getApiAccessLog(Long id) {
        return apiAccessLogMapper.selectById(id);
    }

    @Override
    public PageResult<ApiAccessLogDO> getApiAccessLogPage(ApiAccessLogPageReqVO pageReqVO) {
        return apiAccessLogMapper.selectPage(pageReqVO);
    }

    @Override
    public void createApiAccessLog(ApiAccessLogCreateReqDTO createDTO) {
        ApiAccessLogDO apiAccessLog = BeanUtils.toBean(createDTO, ApiAccessLogDO.class);
        apiAccessLog.setRequestParams(StrUtil.maxLength(apiAccessLog.getRequestParams(), REQUEST_PARAMS_MAX_LENGTH));
        apiAccessLog.setResultMsg(StrUtil.maxLength(apiAccessLog.getResultMsg(), RESULT_MSG_MAX_LENGTH));
        apiAccessLogMapper.insert(apiAccessLog);
        // todo 日志中设置租户上下文数据
//        if (TenantContextHolder.getTenantId() != null) {
//            apiAccessLogMapper.insert(apiAccessLog);
//        } else {
//            // 极端情况下，上下文中没有租户时，此时忽略租户上下文，避免插入失败！
//            TenantUtils.executeIgnore(() -> apiAccessLogMapper.insert(apiAccessLog));
//        }
    }

}
